iT邦幫忙

DAY 8
3

實戰 Java SE 7 系列 第 8

Project Coin - switch 語法支援字串變數 (Stings in switch) 完

  • 分享至 

  • xImage
  •  

雖然程式碼簡化了,對於 case 少的用例來說,還不至於會影響效能,但如果要比對的字串有十幾個呢?一堆 swith case 寫起來也不見得輕鬆,而且最重要的是那要怎麼設計,才能又有效率且又能兼顧程式碼的易維護性與高擴充性呢?
對於這類固定且需要大量重復使用的字串,我們可以把它們集合起來,宣告了一 Enum 型別來包裝他們。例如我們宣告個 Fruit 的 Enum:

package idv.jacky.ironman4.day8;

public enum Fruit {
	蘋果,
	草莓,
	香蕉,
	芭樂,
	葡萄;	
} 

程式碼非常的簡單,就直接把要的字串,一個個打上去,並用逗號(,)隔開,最後用分號(;)結束宣告。

Java 編譯器會自動將這些字串,依序編號為 0, 1, 2, 3, 4的整數值(int),既然是整數,我們就可以直接使用原本的 switch 陳述式了。

package idv.jacky.ironman4.day8;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Day8Example {

	public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        
        Fruit fruit = null;
        String color;
        while (true) {
            System.out.print("請輸入一種水果(蘋果, 草莓, 香蕉, 芭樂, 葡萄) > ");
            try {
                fruit = Fruit.valueOf(in.readLine());
            } catch (Exception e) {
            	continue;
            }
            
            switch (fruit) {
            case 蘋果:
            case 草莓:
            	color = "紅色";
            	break;
            case 香蕉:
            	color = "黃色";
            	break;
            case 芭樂:
            	color = "綠色";
            	break;
            case 葡萄:
            	color = "紫色";
            	break;
            default:
            	continue;
            }

            if (fruit != null && color != null)
            	System.out.printf("%s 的顏色是 %s%n", fruit, color);
            
            fruit = null;
            color = null;
        }
	}
}

新的程式碼是不是跟上一個範例一樣簡潔!而且因為使用整數來比對判斷,效率上也會來的比較好,程式碼也易於撰寫,不會出錯。因為所有的值我們都定義在 Fruit 這個 Enum型別裡,在使用上不會不小心把 "芭樂" 打成 "巴樂"。而且也容易擴充和維護,需要新的值,就只要在 Fruit 裡添加就行了。

更進一步有關 Enum 的詳細使用說明,請參考 Java 程式相關書籍。


上一篇
Project Coin - switch 語法支援字串變數 (Stings in switch) 續
下一篇
Project Coin - 二進位數字表示法
系列文
實戰 Java SE 7 31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言